# encoding: utf-8

import os, os.path, datetime, shutil, time, webbrowser
import EXIF
import upfile, webutil, config

def date2int(year, month, day):
	## 将年-月-日合并成整数
	return year*10000+month*100+day
	
def just_print(fname, *other):
	pass

class photo_picker:
	
	def __init__(self, dstdir, extfilters, ctime=None, bExecute=True):
		'''
		dstdir: 目标目录
		extfilters: 需要处理的文件后缀名列表, 例如: ('.jpg','.png')
		ctime: 表示日期的整数, 由date2int()生成
		'''
		self.__dstdir=dstdir
		self.__filters=[]
		for ext in extfilters:
			self.__filters.append(ext.lower())
		self.__ctime=ctime
		if self.__ctime is None:
			today=datetime.datetime.now()
			self.__ctime=date2int(today.year,today.month,today.day)
		if bExecute:
			self.__command=shutil.copyfile
		else:
			self.__command=just_print
		self.newfiles=[]

	def pick_photos(self, curdir, files):
		## 将指定日期拍摄的照片复制到目标目录,并相应修改文件名
		cnt=0
		err=0
		for f in files:
			base, ext=os.path.splitext(f)
			if ext.lower() not in self.__filters:
				continue
			srcfile=os.path.join(curdir,f)
			## 读取拍摄日期
			f=open(srcfile,'rb')
			tags=EXIF.process_file(f, details=False, stop_tag='EXIF DateTimeOriginal')
			f.close()
			dt=tags.get('EXIF DateTimeOriginal','')
			if dt:
				dt=dt.values.split(b' ')[0]
				year,month,day=dt.split(b':')
				dt=date2int(int(year),int(month),int(day))
			else:
				## 无法读取EXIF信息，改用文件创建日期作为判断依据
				dt=time.localtime(os.path.getctime(srcfile))
				dt=date2int(dt.tm_year,dt.tm_mon,dt.tm_mday)
			if self.__ctime!=dt:
				continue
			newfile='%d-%02d%s'%(self.__ctime,len(self.newfiles),ext.lower())
			dstfile=os.path.join(self.__dstdir,newfile)
			try:
				self.__command(srcfile,dstfile)
				self.newfiles.append(newfile)
				cnt+=1
			except:
				err+=1
				continue
		return (cnt,err)
	
def show_update_page(dt, photos, debug=True):
	'''
	构造更新页面
	dt: 日期
	photos: 照片文件列表
	'''
	assert(dt is not None)
	WEEK_NAME=('一','二','三','四','五','六','日')
	template="update_photos_template.html"
	page="update_photos.html"
	f=open(file=template,mode='rb')
	if debug:
		stemp=f.read()
	else:
		stemp=f.read().replace(b"localhost:8080",config.APP_URL)
	f.close()
	f=open(file=page,mode='wb')
	begtag=b'<!--image begin-->'
	endtag=b'<!--image end-->'
	beg=stemp.find(begtag)
	end=stemp.find(endtag,beg)+len(endtag)
	if beg<0 or end<0 or end<=beg:
		f.close()
		print("客户端界面错误,无法找到*缩略图*替换标记,请检查\"%s\"文件"%template)
		return
	## 构造缩略图
	f.write(stemp[:beg])
	s='''<h3>%d年%d月%d日的照片</h3>\n'''%(dt.year,dt.month,dt.day)
	f.write(s.encode('utf8'))
	f.write('''\t<div id='content'>\n'''.encode('utf8'))
	s1='''\t\t<div style='float:left; margin:0.5em;'>
			<img src="../server/photodiary/photos/'''.encode('utf8')
	s2=('''" alt="周%s" />
			<form><input name='imgcap' type='text' size='22'/></form>
		</div>\n'''%WEEK_NAME[dt.weekday()]).encode('utf8')
	directory=('%d%02d/thumbs/'%(dt.year,dt.month)).encode('utf8')
	for p in photos:
		f.write(s1)
		f.write(directory)
		f.write(p.encode('utf8'))
		f.write(s2)
	f.write('''\t</div> <!--div content-->'''.encode('utf8'))
	## 构造表单
	begtag=b'<!--form begin-->'
	endtag=b'<!--form end-->'
	beg=stemp.find(begtag)
	f.write(stemp[end:beg])
	end=stemp.find(endtag,beg)+len(endtag)
	if beg<0 or end<0 or end<=beg:
		f.close()
		print("客户端界面错误,无法找到*表单*替换标记,请检查\"%s\"文件"%template)
		return
	for i in range(len(photos)):
		s=('imgcap%d'%i).encode('utf8')
		f.write(b'''<input id="''')
		f.write(s)
		f.write(b'''" name="''')
		f.write(s)
		f.write(b'''" type="hidden">\n\t\t''')
	s='%d%02d%02d'%(dt.year,dt.month,dt.day)
	f.write(b'''<input id='date' name='date' type='hidden' value="''')
	f.write(s.encode('utf8'))
	f.write(b'''">\n''')
	f.write(stemp[end:])
	f.close()
	webbrowser.open(page)

def update_photos(date=None, search=True, debug=True):
	'''
	更新照片
	date: 需要更新的日期, None表示当天
	search: 是否需要重新搜索更新照片
	debug: 是否允许开发版,此时使用开发服务器地址 localhost:8080
	照片缩放采样使用Catmull-Rom滤波，可选的滤波方式有：
		0: 箱式滤波
		1: 双线性滤波
		2: B样条滤波
		3: 二维立方滤波
		4: Catmull-Rom滤波
		5: Lanczos滤波
	'''
	if date is None:
		date=datetime.datetime.now()
	tmpdir='..\\tools\\photodiary_temporary'
	if not os.path.isdir(tmpdir):
		os.mkdir(tmpdir)
	picker=photo_picker(tmpdir,config.PHOTO_FILE_TYPE,date2int(date.year,date.month,date.day),search)
	upfile.walk_through(config.PHOTO_DIRECTOR+'%d%02d'%(date.year,date.month),(),(),picker.pick_photos)
	if search:
		command='..\\tools\\imgbatch %s ..\\server\\photodiary\\photos\\%d%02d %d 4'%(tmpdir,date.year,date.month,config.PHOTO_SIZE)
		os.system(command)
		command='..\\tools\\imgbatch %s ..\\server\\photodiary\\photos\\%d%02d\\thumbs %d 4'%(tmpdir,date.year,date.month,config.PHOTO_THUMB_SIZE)
		os.system(command)
	shutil.rmtree(tmpdir)
	## 显示更新页面
	show_update_page(date,picker.newfiles,debug)

if __name__=="__main__":
	## 更新照片
	update_photos(date=datetime.datetime(2011,4,23),search=True,debug=False)

